package com.qzxy.premiumhotelsystem.controller.admin;

import com.qzxy.premiumhotelsystem.common.result.PageResult;
import com.qzxy.premiumhotelsystem.common.result.Result;
import com.qzxy.premiumhotelsystem.domain.dto.OrderPageDTO;
import com.qzxy.premiumhotelsystem.domain.dto.OrderUpdateDTO;
import com.qzxy.premiumhotelsystem.domain.entity.Orders;
import com.qzxy.premiumhotelsystem.service.OrdersService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * ClassName: OrdersController
 * Package: com.qzxy.premiumhotelsystem.controller
 * Description:
 *
 * @Author Qwh
 * @Create 2024/9/12 16:03
 * @Version 1.0
 */

@RestController("adminOrdersController")
@RequestMapping("/admin/orders")
@Tag(name = "管理端预订相关接口")
@Slf4j
public class OrdersController {


    @Resource
    private OrdersService ordersService;

    @Operation(summary = "查看所有预订订单")
    @GetMapping("/all")
    public Result<PageResult> listBookingOrders(@ParameterObject @Validated OrderPageDTO orderPageDTO) {
        log.info("管理端分页查询订单记录，OrderPageDTO：{}", orderPageDTO);
        Result<PageResult> result = ordersService.pageBookingOrderVos(orderPageDTO);
        return result;
    }


    @Operation(summary = "修改订单信息" , description = "这里得注意，这个功能包括可以修改订单的多个信息，但是正常来说roomNumber和status是不能同时出现的，这里后端没有硬性规定，但管理员操作时应注意" +
            "且若是修改房间号，管理员或员工得保证修改的房间价格不低于原本房间价格。还有当用户要修改入住时间，原本入住时间已经超过当前时间1小时，不能让用户修改" +
            "  总的来说，有些地方程序没有硬性规定，当员工应以本酒店利益为主，判断是否能够修改订单信息")
    @PutMapping("/update")
    public Result updateOrder(@ParameterObject @Validated OrderUpdateDTO orderUpdateDTO) {
        log.info("管理员修改订单信息，orderUpdateDTO：{}", orderUpdateDTO);
        Result result = ordersService.updateOrderMessage(orderUpdateDTO);
        return result;
    }

    @Operation(summary = "根据订单id查看订单详情")
    @GetMapping("/{orderId}")
    public Result<PageResult> getOrderDetail(@PathVariable String orderId) {
        log.info("管理端根据订单id查看订单详细记录，orderId：{}", orderId);
        Result result = ordersService.getOrderDetail(orderId);
        return result;
    }

    @Operation(summary = "获取退房时间超时的订单",description = "员工或管理员可查询到超时的订单进行催促")
    @GetMapping("/overdueOrders")
    public Result getOverdueOrders() {
        Result result =  ordersService.findOverdueOrders();
        return result;
    }
}

